// 第一题
// 实现一个normalize方法
// 能将输入的特定字符串转化成特定的结构化数据
// 例子一：‘abc’
// ----> {
//     value: 'abc'
//     }

// 例子二： [abc[bcd[def]]]
// ----> {
//         value: 'abc',
//         children: {
//             value: 'bcd',
//             children: {
//                 value: 'def'
//             }
//         }
//     }


// 思路
// 递归的思想
// 1、将所有的值提取出来
// 2、递归构造成需要的结构
let str = '[abc[bcd[def]]]';
var getStrArr = function(str) {
    // return str.split(/[\[\]]/g).filter(v => v);
    // return str.split(/[\[\]]/g).filter(Boolean);
    return str.match(/\w+/g);
}
const arr = getStrArr(str);
// console.log(arr);


// 第一种思路
// var setTree = function(arr) {
//     let res = {};
//     function go(res) {
//         let str = arr.shift();
//         res.value = str;
//         if (arr.length !== 0) {
//             res.children = {};
//             go(res.children);
//         }
//     };
//     go(res);
//     return res;
// };



// 第二种思路
// var setTree = function(arr) {
//     let res = {};
//     let temp = res;// 核心点这句代码 同一内存的引用
//     while(arr.length > 0) {
//         let str = arr.shift();
//         temp.value = str;
//         if (arr.length !== 0)  temp.children = {};
//         temp = temp.children;
//     }
//     return res;
// }



// 第三种思路
var setTree = function(arr) {
    let res = {};
    arr.reduce((pre, nxt) => { 
        pre.value = nxt;
        if (nxt == arr[arr.length - 1]) return;
        return pre = pre.children = {};
    }, res);
    return res;
}

// 第四种思路
// 指针思想
// let str = '[abc[bcd[def]]]';
var _normalize = function(str) {
    let ponit = 0;
    let start = 0;
    let res = {};
    let temp = res;
    let num = 0;
    while(true) {
        if (str[ponit] == '[' || str[ponit] == ']') {
            if (start != ponit) {
                temp.value = str.substr(start + 1, ponit - start - 1);console.log(ponit, temp)
                start = ponit;
                temp = temp.children = {};
            };
        };
        if (ponit >= str.length - 1) break;
        ponit++;
    };
    return res;
}



var normalize = function(str) {
    let arr = getStrArr(str);
    return setTree(arr);
}
var result = _normalize(str);
console.log(result);